/* Copyright 2001,2002,2003 NAH6
 * All Rights Reserved
 *
 * Parts Copyright DoD, Parts Copyright Starium
 *
 */
#include "main.h"
#include "con_stch.h"
#include <stdio.h>

extern fxpt_16 StochCB[1082];   /* This is defined in StochCB.h */

/**************************************************************************
*                                                                         *
* ROUTINE
*               CalcStoch
*
* FUNCTION
*               Calculate Stochastic codebook contribution to synthesis
*               from code book index and gain
*
* SYNOPSIS
*               CalcStoch(s_index, s_gain, vector)
*
*   formal
*
*                       data    I/O
*       name            type    type    function
*       -------------------------------------------------------------------
*       s_index         int      i      stochastic codebook index
*       s_gain          fxpt_16  i      stochastic codebook gain
*       vector          fxpt_16  o      vector from stochastic codebook
*
**************************************************************************/
void ConstructStochCW(
int     s_index,
fxpt_16 s_gain,                 /* 11.4 format */
fxpt_16 vector[SF_LEN])         /* 15.0 format */
{
        int     codeword;
        int     i;

        /*  Copy selected vector to excitation array */
        codeword = 2 * (MAX_STOCH_CB_SIZE - s_index);
        if (codeword < 0) {
                CELP_PRINTF(("ConstructStochCW: Error in codeword calculation\n"));
                codeword = 0;
        }
        for (i = 0; i < SF_LEN; i++)
                switch (StochCB[i + codeword]) {
                case -1:
                        vector[i] = fxpt_shr16_round(fxpt_negate16(s_gain), 4);
                        break;
                case 0:
                        vector[i] = 0;
                        break;
                case 1:
                        vector[i] = fxpt_shr16_round(s_gain, 4);
                        break;
                default:
                        CELP_PRINTF(("Fatal: Error in stochastic codebook\n"));
                        CELP_PRINTF(("StochCB[%d] = %d\n", i+codeword,
                                StochCB[i+codeword]));
                        CELP_ABORT();
                }
}
